#include "proxy_starter.h"
#include "proxy_process.h"
#include <string.h>

int ProxyStarter::operator() (std::map<std::string, std::pair<int*, int*> > &map_pipe, 
		const char *oj_name, int msg_id, const char *cookie_dir) const {
	pid_t pid = fork();
	if (pid > 0) { // 父进程，也就是监听进程
		return START_PROXY_OK;
	}
	else if (pid < 0) { // 父进程启动代理进程失败
		return START_PROXY_ERROR;
	}
	
	// 在代理进程中，先关闭不需要的文件描述符（管道）
	std::map<std::string, std::pair<int*, int*> >::iterator it;
	for (it = map_pipe.begin(); it != map_pipe.end(); it++) {
		int *pipe_ptr1 = it->second.first;
		int *pipe_ptr2 = it->second.second;
		close(pipe_ptr1[1]);
		close(pipe_ptr2[0]);
	}
	// 在代理进程中，先关闭不需要的文件描述符（管道）
	
	int in_pipe = map_pipe[oj_name].first[0];
	int out_pipe = map_pipe[oj_name].second[1];
	//close(map_pipe[oj_name].first[1]);
	//close(map_pipe[oj_name].second[0]);

	// 逐一判断是启动哪个代理，若添加了新的代理服务，则修改这里的代码
	if (!strcmp(oj_name, "poj")) {
		poj_proxy_process(in_pipe, out_pipe, msg_id, cookie_dir);
	}
	else if (!strcmp(oj_name, "hdu")) {
		hdu_proxy_process(in_pipe, out_pipe, msg_id, cookie_dir);
	}
	// 逐一判断是启动哪个代理，若添加了新的代理服务，则修改这里的代码
}
